В Ruby вызов метода — это не статический переход по адресу памяти; это динамическое событие передачи сообщения. Когда вы вызываете метод, вы отправляете сообщение объекту- получателю. Это сообщение состоит из имени метода, опциональных аргументов и потенциального связывания блока.
1. Синтаксис вызова и двусмысленность
Ruby предоставляет большую гибкость: Foo.Bar и Foo.Bar() идентичны. Однако, Foo::Bar обычно указывает на константу, в то время как Foo::Bar() принудительно вызывает метод. Скобки часто опускаются, чтобы создать опыт, подобный языку специализированного домена (DSL), где методы выглядят как свойства.
2. Распад операторов
Операторы на самом деле являются переопределяемыми методами. Выражение expr1 + expr2 — это сокращение для (expr1).+(expr2). Это относится к унарным (-obj), бинарным (a < b), и постфиксным операторам.
3. Механизм передачи управления (yield)
Методы используют yield для передачи потока управления в связанный блок. Используя Kernel.block_given?, метод может динамически решить, как обрабатывать логику, основываясь на контексте вызывающего кода.